"""
    1.Sobel检测算子
        cv.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
            参数：
                src:传入的图像，
                ddepth：图像的深度，
                dx和dy：指求导的阶数，0表示这个方向上没有求导，取值为0、1
                ksize：是Sobel算子的大小，即卷积核的大小，必须是1、3、5、7，默认为3（如果ksize=-1，就演变为3*3的Scharr算子）
                scale：缩放导数的比例常数，默认情况为没有伸缩系数
                borderType：图像边界的模式，默认值为cv2.BORDER_DEFAULT

    2. 格式转换函数：
        cv.convertScaleAbs(x)
    3. 图像混合
        cv.addWeighted(src1, alpha, src2, beta)
"""
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 1. 读取图像
img = cv.imread("image/horse.jpg", 0)

# 2. 计算Sobel卷积结果
# x = cv.Sobel(img, cv.CV_16S, 1, 0)
# y = cv.Sobel(img, cv.CV_16S, 0, 1)

# Scharr算子
x = cv.Sobel(img, cv.CV_16S, 1, 0, ksize=-1)
y = cv.Sobel(img, cv.CV_16S, 0, 1, ksize=-1)

# print(len(x))
# print(x)
# print(len(y))
# print(y)

# 3. 将数据进行转换
Scale_absX = cv.convertScaleAbs(x)  # convert 转换 scale 缩放
Scale_absY = cv.convertScaleAbs(y)

# 4. 结果合成
result = cv. addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)
# print(img.shape)
# print(result.shape)

# 5. 图像显示
plt.figure(figsize=(10, 8), dpi=100)
plt.subplot(121), plt.imshow(img, cmap=plt.cm.gray), plt.title("原图")
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(result, cmap=plt.cm.gray), plt.title("Sobel滤波后结果")
plt.xticks([]), plt.yticks([])
plt.show()

